home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 34.zip / BS1 part 34 / FredFish PD 314.adf / Zc / zcsrc.lzh / IOLib / stdio / fopen.c < prev    next >
C/C++ Source or Header  |  1989-06-16  |  2KB  |  108 lines

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <malloc.h>
  4. #include <errno.h>
  5.  
  6. #define    LAST_DEVICE    (2)        /* lowest character device handle # */
  7.  
  8. static FILE *_fopen(filename, mode, fp)
  9.     char *filename;
  10.     register char *mode;
  11.     register FILE *fp;
  12. /*
  13.  *    INTERNAL FUNCTION.  Attempt to open <filename> in the given
  14.  *    <mode> and attach it to the stream <fp>
  15.  */
  16.     {
  17.     register char *p = NULL;
  18.     register int h, i, iomode = 0, f = 0;
  19.  
  20.     while(*mode)
  21.         {
  22.         switch(*mode++)
  23.             {
  24.             case 'r':
  25.                 f |= _IOREAD;
  26.                 break;
  27.             case 'w':
  28.                 f |= _IOWRT;
  29.                 iomode |= (O_CREAT | O_TRUNC);
  30.                 break;
  31.             case 'a':
  32.                 f |= _IOWRT;
  33.                 iomode |= (O_CREAT | O_APPEND);
  34.                 break;
  35.             case '+':
  36.                 f |= (_IOREAD | _IOWRT);
  37.                 break;
  38.             case 'b':
  39.                 f |= _IOBIN;
  40.                 break;
  41.             case 't':
  42.                 f &= ~_IOBIN;
  43.                 break;
  44.             default:
  45.                 fputs(stderr, "Illegal file mode.\n");
  46.                 return(NULL);
  47.             }
  48.         }
  49.     if((i = (f & (_IOREAD | _IOWRT))) == 0)
  50.         return(NULL);
  51.     else if(i == _IOREAD)
  52.         iomode |= O_RDONLY;
  53.     else if(i == _IOWRT)
  54.         iomode |= O_WRONLY;
  55.     else
  56.         iomode |= O_RDWR;
  57.     h = open(filename, iomode, 0x00);
  58.     if(h < LAST_DEVICE)
  59.         {
  60.         errno = h;
  61.         return(NULL);        /* file open/create error */
  62.         }
  63.     if(isatty(h))
  64.         f |= (_IODEV | _IONBF);
  65.     else
  66.         f |= _IOFBF;
  67.     fp->_file = h;            /* file handle */
  68.     fp->_flag = f;            /* file status flags */
  69.     fp->_base = NULL;        /* base of file buffer */
  70.     fp->_ptr = NULL;        /* current buffer pointer */
  71.     fp->_bsiz = 0;            /* buffer size */
  72.     fp->_cnt = 0;            /* # of bytes in buffer */
  73.     return(fp);
  74.     }
  75.  
  76. FILE *fopen(filename, mode)
  77.     char *filename, *mode;
  78.     {
  79.     register int i;
  80.     register FILE *fp = NULL;
  81.  
  82.     for(i=0; (!fp && (i < _NFILE)); ++i)
  83.         if(!(_iob[i]._flag & (_IOREAD | _IOWRT)))   /* empty slot? */
  84.             fp = &_iob[i];
  85. #if 0
  86.     if(fp)
  87.         return(_fopen(filename, mode, fp));
  88.     else
  89.         return(NULL);
  90. #else
  91.     return(fp ? _fopen(filename, mode, fp) : NULL);
  92. #endif
  93.     }
  94.  
  95. FILE *freopen(filename, mode, fp)
  96.     char *filename, *mode;
  97.     FILE *fp;
  98.     {
  99. #if 0
  100.     if(fclose(fp))
  101.         return(NULL);
  102.     else
  103.         return(_fopen(filename, mode, fp));
  104. #else
  105.     return(fclose(fp) ? NULL : _fopen(filename, mode, fp));
  106. #endif
  107.     }
  108.